﻿using System.Security.Cryptography.X509Certificates;

namespace los15
{
    class Father
    {
        public void Speak()
        {
            
        }
    }
    class Son:Father
    {
        public  Son()
        {
           
        }
    }
    #region     知识点二   万物之父
    //万物之父
    //关键字：object
    //概念：
    //object是所有类型的基类（引用类型）
    //作用：
    //1.可以利用里氏替换原则，用object容器装所有对象
    //2.可以用来表示不确定类型，作为函数参数类型
    #endregion
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("万物之父和装箱拆箱");
            Father f = new Son();
            if(f is Son)
            {
                (f as Son).Speak();
            }

            //引用类型
            object o = new object();
            //用is as转换即可
            if(o is Son)
            {
                (o as Son).Speak();
            }
            //值类型
            object o2 = 1f;
            //强转
            float f2 = (float)o2;

            //特殊的string类型
            object str = "123123";
            string str2 = str as string;

            //数组
            object arr = new int[10];
            int[] arr2 = arr as int[];

            #region     知识点三   装箱拆箱
            //发生条件
            //用object存值类型（装箱）
            //再把object转为值类型（拆箱）

            //装箱
            //把值类型用引用类型存储
            //栈内存会迁移到堆内存中

            //拆箱
            //把引用类型存储的值类型取出来
            //堆内存会迁移到栈内存中

            //好处：不确定类型时可以方便参数的存储和传递
            //坏处：存在内存迁移，增加性能消耗

            //装箱
            object v = 63;
            //拆箱
            int intValue = (int)v;
            #endregion
        }

        //总结：
        //万物之父：object
        //基于里氏替换原则的 可以用object容器装载一切类型的变量
        //它是所有类型的基类

        //装箱拆箱
        //用object存值类型（装箱）
        //把object里面存的值 转换出来（拆箱）
        //好处
        //不去定类型时可以用 方便参数存储和传递
        //坏处
        //存在内存的迁移 增加了性能消耗
        //不是不用  尽量少用
    }
}
